/**
 * 全局共用方法
 * @constructor
 * @param { string } title - 全局 公用方法定义
 * @param { string } author - Sky_sjr
 * */

import Cookies from "js-cookie";
import { Message } from "element-ui";

const STORAGETYPE = window.localStorage;    // 存储类型

const common = {
    /* 存储相关 */
    /**
     * @description 设置本地存储方法
     * @param {string} key 键
     * @param {any} value 值
     * @param {number} time 时效 默认24小时
     * */
    setStorage(key, value, time = 24) {
        const now = new Date();
        const item = {
            value: value,
            expiration: now.getTime() + (time * 60 * 60 * 1000)
        };
        STORAGETYPE.setItem(key, JSON.stringify(item));
    },
    /**
     * @description 获取本地存储
     * @param {string} key 键
     * */
    getStorage(key) {
        const item = STORAGETYPE.getItem(key);
        if (item) {
            const parsedItem = JSON.parse(item);
            const now = new Date().getTime();
            if (now > parsedItem.expiration) {
                STORAGETYPE.removeItem(key);
                return null; // 数据已过期，返回null
            }
            return parsedItem.value;
        }
        return null; // 未找到对应数据
    },
    /**
     * @description 移除本地存储
     * @param {string} key 键
     * */
    removeStorage(key) {
        STORAGETYPE.removeItem(key);
    },
    /**
     * @description 设置Cookie
     * @param {string} key 键
     * @param {string} value 值
     * @param {number} time 时效 默认24小时
     * */
    setCookie(key, value, time = 24) {
        const now = new Date();
        const item = {
            value: value,
            expiration: now.getTime() + (time * 60 * 60 * 1000)
        };
        Cookies.set(key, JSON.stringify(item))
    },
    /**
     * @description 获取Cookie
     * @param {string} key 键
     * */
    getCookie(key) {
        const item = Cookies.get(key)
        if (item) {
            const parsedItem = JSON.parse(item);
            const now = new Date().getTime();
            if (now > parsedItem.expiration) {
                Cookies.remove(key)
                return null; // 数据已过期，返回null
            }
            return parsedItem.value;
        }
        return null; // 未找到对应数据
    },
    /**
     * @description 移除cookie
     * @param {string} key 键
     * */
    removeCookie(key) {
        Cookies.remove(key)
    },

    /* 手机号码相关 */
    /**
     * @description 验证手机号号码是否合法
     * @param {string} phoneNumber 电话号码
     * */
    validatePhoneNumber(phoneNumber) {
        // 中国大陆手机号码的正则表达式
        const regex = /^1[3-9]\d{9}$/;
        return regex.test(phoneNumber);
    },
    /**
     * @description 替换电话号码中间四位 153****0011
     * @param { string } phoneNumber 电话号码
     * */
    replacePhoneNumber(phoneNumber) {
        // 使用正则表达式匹配手机号码中间的四位数字
        const regex = /(\d{3})\d{4}(\d{4})/;
        // 将匹配到的部分替换为"****"
        const maskedPhoneNumber = phoneNumber.replace(regex, '$1****$2');
        return maskedPhoneNumber;
    },
    /**
     * @description 短横线格式化电话号码 按照3-4-4格式划分电话号码 123-4567-8910
     * @param { string } mobile
     * */
    shortDashesformatPhoneNumber(mobile) {
        let mobileReg = /(?=(\d{4})+$)/g
        return mobile.replace(mobileReg, '-')
    },
    /**
     * @description 格式化电话号码 按照 每4位数字之后添加一个空格（1234 5678 910 ）的格式划分
     * @param { string } tel 电话号码
     * */
    formatTelephone(tel) {
        return tel.replace(/(\d{4})(?=\d)/g, '$1 ');
    },

    /* 地址栏、链接相关 */
    /**
     * @description 判断URL的前缀是HTTPS还是HTTP
     * @param {string} url 需要检查的url地址
     * */
    isCheckProtocol(url) {
        const checkProtocol = /^https?:/
        return checkProtocol.test(url)
    },
    /**
     * @description 解析链接上的搜索参数
     * @param {string} name 值
     * */
    getQueryByName(name) {
        const queryNameRegex = new RegExp(`[?&]${name}=([^&]*)(&|$)`)
        const queryNameMatch = window.location.search.match(queryNameRegex)
        return queryNameMatch ? decodeURIComponent(queryNameMatch[1]) : ''
    },

    /* 数组、对象相关 */
    /**
     * @description 数组对象去重
     * @param {Array[obj]} arr 需要去重的对象
     * */
    arrayObjectDeduplication(arr) {
        const uniqueSet = new Set(arr.map(JSON.stringify));
        const uniqueArray = Array.from(uniqueSet).map(JSON.parse);
        return uniqueArray
    },
    /**
     * @description 判断对象中所有值是否为空
     * @param { Object } 需要判断的对象
     * */
    isObjectEmpty(obj) {
        for (var key in obj) {
            if (
                obj.hasOwnProperty(key) &&
                obj[key] !== null &&
                obj[key] !== undefined &&
                obj[key] !== ""
            ) {
                return false;
            }
        }
        return true;
    },

    /* 时间日期相关 */
    /**
         * @description 时间格式化 默认 Day
         * @param {string | Date} time 需要处理的时间
         * @param {string} format   返回日期格式 Year | Month | Day | Hour | Minute | Second
         * */
    timeFormatting(time, format = "Day") {
        const times = new Date(time)
        let YYYY = times.getFullYear(),
            MM = times.getMonth() + 1,
            DD = times.getDate(),
            hh = times.getHours(),
            mm = times.getMinutes(),
            ss = times.getSeconds();

        MM = MM < 10 ? `0${MM}` : MM
        DD = DD < 10 ? `0${DD}` : DD
        hh = hh < 10 ? `0${hh}` : hh
        mm = mm < 10 ? `0${mm}` : mm
        ss = ss < 10 ? `0${ss}` : ss

        const formatObj = {
            'Year': `${YYYY}`,
            'Month': `${YYYY}-${MM}`,
            'Day': `${YYYY}-${MM}-${DD}`,
            'Hour': `${YYYY}-${MM}-${DD} ${hh}`,
            'Minute': `${YYYY}-${MM}-${DD} ${hh}:${mm}`,
            'Second': `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`,
        }
        return formatObj[format]
    },

    /* 金额 相关 */
    /**
     * @description 货币格式化  100,000.00
     * @param { string | number } number 需要格式化的数字
     * @param { number } format 格式化保留小数位数，不传默认保存两位小数
     * */
    formatMoney(money, format = 2) {
        const _number = Number(money)
        const _format = format
        const formattedNumber = _number.toLocaleString('en-US', { minimumFractionDigits: _format, maximumFractionDigits: _format })
        return formattedNumber
    },
    /**
     * @description 验证电子邮箱是否合法
     * @param { string } email 需要验证的邮箱
     * */
    isValidEmail(email) {
        // 电子邮箱的正则表达式
        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        return emailRegex.test(email);
    },

    /* 其他 */
    /**
     * @description 文件流下载
     * @param {string} url 文件下载地址
     * @param {string} fileName 文件名称
     * */
    downloadFile(url, fileName) {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'blob';
        xhr.onload = () => {
            if (xhr.status === 200) {
                // 获取文件
                const blob = xhr.response;
                // 创建a标签
                const a = document.createElement('a');
                a.href = window.URL.createObjectURL(blob);
                a.download = fileName;
                a.style.display = 'none';
                document.body.appendChild(a);
                a.click();

                Message({
                    type:"success",
                    message:"下载成功！"
                })

                // 移除a标签
                window.URL.revokeObjectURL(a.href);
                document.body.removeChild(a);
            } else {
                Message({
                    type:"error",
                    message:"下载失败"
                })
            }
        }
        xhr.send();
    },
    /**
     * @description 复制内容到剪贴板
     * @param {string} content 需要复制的内容
     * */
    copyToClipboard(content) {
        const textarea = document.createElement("textarea")
        textarea.value = content
        document.body.appendChild(textarea)
        textarea.select()
        document.execCommand("Copy")
        textarea.remove()
        Message({
            type:'success',
            message:"复制成功！"
        })
    },
    /**
     * @description 生成 uuid
     * @param 返回 随机uuid
     * */
    generateUUID() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            var r = Math.random() * 16 | 0,
                v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    },
    /**
     * @description 去除字符串的前导和尾随空格
     * @param {string} str 需要去除的字符串
     * */
    removeStringExcessSpaces(str) {
        // 方式一
        // return str.replace(/^\s*(.*?)\s*$/g, '$1')
        // 方式二
        return str.replace(/^\s*|\s*$/g, '')
    },
    /**
     * @description 判断当前设备是否是移动端
     * @param 返回 true 是移动端； false 不是移动端
     * */
    isMobileDevice() {
        let flag = navigator.userAgent.match(
            /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
        );
        return flag;
    },
}


export default common
